<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>闭包</title>
	</head>
	<body>
		<div>1</div>
		<div>2</div>
		<div>3</div>
		<div>4</div>
		<div>5</div>
		<script type="text/javascript">
			var nodes = document.getElementsByTagName("div");
			for(var i=0;i<nodes.length;i++){
				(function(i){
					nodes[i].onclick = function(e){ //重点：如果
					// nodes[i].onclick = function(){
						console.log(i);
						console.log(e);
					}
				})(i)	//这里的i是传入立即执行的匿名函数中要传入的参数
			}
			
			/* 重点：立即执行函数(function(){})() (function(){}()) 并不是闭包*/
			
			/* 封装变量 */
				/* 通常写法：数组的累乘 */
				var arg = [1,2,3];
				var mult = function(){
					var a = 1;
					for(var i=0;i<arg.length;i++){
						a = a * arg[i];
					}
					return a;
				}
				var result = mult();
				console.log(result);
				
				/* 提高效率，对于同样的数组，不再计算，而是直接返回 */
				var cache = {};
				var mult2 = function(argument){
					var argstr = Array.prototype.join.call(argument,',');
					if(cache[argstr]){
						return cache[argstr];
					}
					var a = 1;
					console.log("different arr");
					for(var i=0;i<arg.length;i++){
						a = a * arg[i];
					}
					return cache[argstr] = a;
				}
				var arg2 = [1,2,3];
				mult2(arg);
				mult2(arg2);//结果只会出现一次"different arr"
				
		</script>
	</body>
</html>
